package com.example.activiti7.domain.model.resp;

import com.example.activiti7.domain.model.req.BasePageReq;
import com.github.pagehelper.PageInfo;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页对象
 *
 * @author PD
 */
@SuppressWarnings("unchecked")
@Schema(name = "Page", description = "分页查询数据视图对象<列表数据报文对象，请求参数报文对象>")
public class Page<T, V extends BasePageReq> extends PrintFriendliness {
    /**
     * 总页数
     */
    @Schema(description= "页码总数")
    private int pageTotal = -1;
    /**
     * 总条数
     */
    @Schema(description= "总条数")
    private long total = -1;
    /**
     * 数据集合
     */
    @Schema(description = "数据集合")
    private List<T> pageList;
    /**
     * 请求参数报文对象
     */
    @Schema(description = "查询参数,BasePageReq子类对象")
    private V query;

    public int getPageTotal() {
        return (int) Math.ceil((double) this.getTotal() / query.getPageSize());
    }

    public void setPageTotal(int pageTotal) {
        this.pageTotal = pageTotal;
    }

    public long getTotal() {
        return total;
    }

    public void setTotal(long total) {
        this.total = total;
    }

    public List<T> getPageList() {
        return pageList;
    }

    public void setPageList(List<T> pageList) {
        this.pageList = pageList;
    }

    public V getQuery() {
        return query;
    }

    public void setQuery(V query) {
        this.query = query;
    }

    public Page() {

    }

    public Page(List<T> list, Long total, V req) {
        this.setTotal(total);
        this.setPageList(list);
        this.setQuery(req);
    }

    /**
     * 构建PageEx对象
     *
     * @param total 总数
     * @param req   请求对象
     * @param <T>   数据项类型
     * @param <V>   请求参数类型
     * @return
     */
    public static <T, V extends BasePageReq> Page<T, V> builder(List<T> list, Long total, V req) {
        return new Page(list, total, req);
    }
    /**
     * 构建PageEx对象
     *
     * @param total 总数
     * @param req   请求对象
     * @param <T>   数据项类型
     * @param <V>   请求参数类型
     * @return
     */
    public static <T, V extends BasePageReq> Page<T, V> builder(Long total, V req) {
        return new Page(new ArrayList(), total, req);
    }

    /**
     * 构建PageEx对象
     *
     * @param list 继承了ArrayList的PageHelper的Page列表对象
     * @param req  请求对象
     * @param <T>  数据项泛型
     * @param <V>  请求参数泛型
     * @return
     */
    public static <T, V extends BasePageReq> Page<T, V> builder(List<T> list, V req) {
        PageInfo<T> pageInfo = new PageInfo<>(list);
        return new Page(pageInfo.getList(), pageInfo.getTotal(), req);
    }

    /**
     * 构建PageEx对象
     *
     * @param pageInfo PageInfo任意类型对象
     * @param req      请求对象
     * @param <T>      数据项泛型
     * @param <V>      请求参数泛型
     * @return
     */
    public static <T, V extends BasePageReq> Page<T, V> builder(PageInfo<?> pageInfo, V req) {
        return new Page(pageInfo.getList(), pageInfo.getTotal(), req);
    }
}
